/**
 * 样式函数
 * @param {number} time
 * @returns
 */
function timeout(time) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve();
    }, time);
  });
}

class SuperTask {
  constructor() {
    this.startTime = undefined;
    this.taskList = []; // 收集任务
    this.runCount = 0; // 正在运行的任务数量
    this.runMaxCount = 2; // 最多可以同时运行的任务数量
  }

  run() {
    // 循环判断 要不要去拿任务执行。不明确循环次数 一般用 while
    while (this.runCount < this.runMaxCount && this.taskList.length) {
      const item = this.taskList.shift(); // 删除最前面一个任务
      this.runCount++;
      // item
      //   .fn()
      //   .then((res) => {
      //     item.resolve();
      //     this.runCount--;
      //     this.run();
      //   })
      //   .catch((err) => {
      //     item.reject();
      //     this.runCount--;
      //     this.run();
      //   });
      // 简写
      item
        .fn()
        .then(() => {
          const rowTime = new Date().getTime();
          const mm = rowTime - this.startTime; // 单位 ms
          item.resolve(mm);
        }, item.reject)
        .finally(() => {
          // 任务执行成功 或者失败后 一定 正在运行的数量减一。同时在调用 this.run。在判断要不要执行任务
          this.runCount--;
          this.run();
        });
    }
  }

  add(fn) {
    if (!this.startTime) {
      this.startTime = new Date().getTime();
    }
    return new Promise((resolve, reject) => {
      this.taskList.push({
        fn,
        resolve,
        reject,
      });
      this.run();
    });
  }
}

const superTask = new SuperTask();

function addTask(time, name) {
  superTask
    .add(() => timeout(time))
    .then((res) => {
      console.log(res + "ms,任务" + name + "完成");
    });
}

// addTask(10000, 1);
// addTask(5000, 2);
// addTask(3000, 3);
// addTask(4000, 4);

addTask(1000, 1);
addTask(1000, 2);
addTask(1000, 3);
addTask(1000, 4);
